/**
 * 文件名：@AbstractConverter.java <br/>
 * 包名：cn.efunbox.afw.core.converter <br/>
 * 项目名：afw-core <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.core.converter;

import java.lang.reflect.Array;

/**
 * 类名：AbstractConverter  <br />
 *
 * 功能：
 *
 * @author xtwin <br />
 * 创建时间：2015年12月4日 下午4:35:53  <br />
 * @version 2015年12月4日
 */
public abstract class AbstractConverter implements Converter {
	
	// 日志记录器
	//private static final Log logger = LogFactory.getLog(AbstractConverter.class);
	
	// 类型
	protected Class<?> type;

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2015年12月4日 下午4:36:10<br/>
	 * 
	 * @param value
	 * @param config
	 * @return
	 * @throws Exception <br/>
	 * @see cn.efunbox.afw.core.converter.Converter#convert(java.lang.Object, java.lang.Object)
	 */
	@Override
	public Object convert(Object original, Object config) throws Exception {
		Object value = original;
		
		if (null != original) {
			if (original instanceof Object[]) {
				
				// 强转为数组
				Object[] datas = (Object[]) original;
				
				// 创建对应类型的空数组
				Object[] _values = (Object[]) Array.newInstance(type, datas.length);
				
				// 通过循环，将数组中的每个值执行类型转换逻辑
				for (int i = 0, len = datas.length; i < len; i++) {
					Object tmp = datas[i];
					
					// 执行格式转换
					_values[i] = type.isInstance(tmp) ? tmp : doConvert(tmp, config);
				}
				
				// 付给变量，用于返回操作
				value = _values;
			} else {
				value = type.isInstance(original) ? original : doConvert(original, config);
			}
		}
		
		// 返回转换后的值
		return value;
	}

	/**
	 * 
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2015年12月4日 下午4:37:32 <br/>
	 */
	protected abstract Object doConvert(Object original, Object config) throws Exception;

	/**
	 * @version 2015年12月4日-下午4:37:51
	 */
	public void setType(Class<?> type) {
		this.type = type;
	}
}
